package com.example.baseballgame;

import java.util.Arrays;
import java.util.Date;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class PlayActivity extends Activity implements View.OnClickListener {
	
	/********************** 일반적 변수 **********************/
	private SoundPool pool;
	private int sound;
	private int playCnt;			// 플레이 횟수
	private int inputClick;			// 숫자버튼 클릭 횟수
	private int setRuleNum;			// 설정된 룰 숫자
	private int score;				// 점수
	private MyDbHelper helper;		// sqlite를 쓰기 위한 객체
	private String id;				// id
	private String pwd;				// pwd
	private int[] com_Array;		// 랜덤 숫자를 담는 배열
	private int[] result_Array;		// strike, ball, out 담는 배열
	
	/********************** 숫자 버튼 *************************/
	
	private Button buttonNum0;
	private Button buttonNum1;
	private Button buttonNum2;
	private Button buttonNum3;
	private Button buttonNum4;
	private Button buttonNum5;
	private Button buttonNum6;
	private Button buttonNum7;
	private Button buttonNum8;
	private Button buttonNum9;
	
	private TextView[] textViews;		// 숫자 표시 배열
	
	private TextView numView1;			// 숫자 표시 하는 곳1
	private TextView numView2;			// 숫자 표시 하는 곳2
	private TextView numView3;			// 숫자 표시 하는 곳3
	private TextView numView4;			// 숫자 표시 하는 곳4
	private TextView textviewResult;	// 결과 표시 텍스트 뷰
	
	private ImageView ruleimage;		// 설정된 숫자 룰 이미지 표시
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		pool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
		sound = pool.load(this, R.raw.complate, 1);
		helper = new MyDbHelper(this, "baseballgameDB.sqlite", null, 1);
		
		/*****************  RuleActivity에서 넘겨준 인덴트 데이터 ****************/
		Intent intent = getIntent();
		String rule = (String)intent.getStringExtra("numrule");
		
		setRuleNum = Integer.parseInt(rule);
		
		Bitmap image = null;
		
		//설정된 룰로 변경되는 View화면
		if(rule.equals("3")){
			image = BitmapFactory.decodeResource(getResources(), R.drawable.rule3);
			setContentView(R.layout.activity_playing_main3);
		}else{
			image = BitmapFactory.decodeResource(getResources(), R.drawable.rule4);
			setContentView(R.layout.activity_playing_main4);
		}
		
		//설정된 룰로 textview 배열 설정
		textViews = new TextView[setRuleNum];
		
		numView1 = (TextView)findViewById(R.id.numView1);
		numView2 = (TextView)findViewById(R.id.numView2);
		numView3 = (TextView)findViewById(R.id.numView3);
		
		textViews[0] = numView1;
		textViews[1] = numView2;
		textViews[2] = numView3;
		
		//4자리 일때만 생성
		if(setRuleNum == 4){
			numView4 = (TextView)findViewById(R.id.numView4);
			textViews[3] = numView4;
		}
		
		/********************* 버튼 위젯 객체화 *********************/
		buttonNum0 = (Button)findViewById(R.id.buttonNum0);
		buttonNum1 = (Button)findViewById(R.id.buttonNum1);
		buttonNum2 = (Button)findViewById(R.id.buttonNum2);
		buttonNum3 = (Button)findViewById(R.id.buttonNum3);
		buttonNum4 = (Button)findViewById(R.id.buttonNum4);
		buttonNum5 = (Button)findViewById(R.id.buttonNum5);
		buttonNum6 = (Button)findViewById(R.id.buttonNum6);
		buttonNum7 = (Button)findViewById(R.id.buttonNum7);
		buttonNum8 = (Button)findViewById(R.id.buttonNum8);
		buttonNum9 = (Button)findViewById(R.id.buttonNum9);
		
		ruleimage = (ImageView)findViewById(R.id.ruleimage);			//설정한 룰 이미지정보
		textviewResult = (TextView)findViewById(R.id.textviewResult); 	//결과 확인 텍스트 뷰
		
		ruleimage.setImageBitmap(image);	//설정한 룰 이미지 삽입
		
		//게임 초기화
		init();
		
		/**********************  이벤트 발생 버튼 **********************/
		buttonNum0.setOnClickListener(this);
		buttonNum1.setOnClickListener(this);
		buttonNum2.setOnClickListener(this);
		buttonNum3.setOnClickListener(this);
		buttonNum4.setOnClickListener(this);
		buttonNum5.setOnClickListener(this);
		buttonNum6.setOnClickListener(this);
		buttonNum7.setOnClickListener(this);
		buttonNum8.setOnClickListener(this);
		buttonNum9.setOnClickListener(this);
		
	}

	/**
	 * 초기화 메서드
	 */
	public void init() {
		id = "admin";
		pwd = "1111";
		result_Array = new int[3];
		com_Array 	 = new int[setRuleNum];
		
		//숫자 표시 초기화
		for (TextView v : textViews) {
            v.setText(" ");
        }
		
		//중복되지 않는 3개의 난수 저장.
        int i = 0;
        do {
            int r = (int) (Math.random() * 10);
            com_Array[i] = r;

            for (int j = 0; j < i; j++) { // 중복되는 값 검사.
                if (com_Array[i] == com_Array[j]) {
                    i--; // 중복값이 있으면 i변수를 -1.
                    break; // 반복문 종료
                }// if
            }// for

            i++;

        } while (i < setRuleNum); //룰 설정만큼 숫자 생성 

        //결과 표시 초기화
      	textviewResult.setText("");
      		
        inputClick = 0;
        
        /*if(setRuleNum == 3){ 
        	System.out.println("랜덤 변수 = " + com_Array[0] + com_Array[1] + com_Array[2]);	
        }else{
        	System.out.println("랜덤 변수 = " + com_Array[0] + com_Array[1] + com_Array[2] + com_Array[3]);
        }*/
        
	}

	/**
	 * 숫자 버튼 클릭 이벤트 메서드
	 */
	@Override
	public void onClick(View v) {
		Button btn = (Button)v;
		String strNum = btn.getText().toString();
		
		//설정된 룰 숫자
		if(inputClick < setRuleNum){
			
			//같은 수 입력 배제 처리
			for(TextView tv : textViews){
				if(tv.getText().toString().trim().equals(strNum)){
					return;
				}
			}
			
			//클릭한 숫자 표시
			textViews[inputClick].setText(strNum);
			inputClick++;
		}else{
			Toast.makeText(v.getContext(), "확인버튼을 눌러주세요!", Toast.LENGTH_SHORT).show();
		}
	}
	
	/**
	 * 확인 버튼을 눌렀을 때
	 * @param v
	 */
	public void doConfirm(View v){
		
		result_Array = new int[setRuleNum];
		
		//숫자를 모두 입력해야 진행
		if(inputClick != setRuleNum){
			Toast.makeText(v.getContext(), "숫자를 모두 입력해 주세요!", Toast.LENGTH_SHORT).show();
			return;
		}
		
		//사용자가 입력한 숫자를 담는 배열
		int user_Array[] = new int[setRuleNum];  

		//입력한 숫자를 담는다.
		for(int i=0; i < setRuleNum; i++){
			user_Array[i] = Integer.parseInt(textViews[i].getText().toString());
		}

		//랜덤 숫자와 사용자 입력 숫자 비교
		for(int i=0; i < setRuleNum; i++){
			for(int j=0; j < setRuleNum; j++){
				if(com_Array[i] == user_Array[j]){
					if(i == j){
						result_Array[0]++;	//strike
					}else{
						result_Array[1]++;	//ball
					}//if
				}//if
			}//for
		}//for
		
		result_Array[2] = setRuleNum - (result_Array[0] + result_Array[1]);
		
		inputClick = 0;//입력 횟수 초기화 
        playCnt++;// 플레이 카운트 증가
        
        //결과값 출력변수
        String strResult;
        
        //숫자를 맞췄을 때
        if(result_Array[0] == setRuleNum){
        	Toast.makeText(v.getContext(), "정답입니다!", Toast.LENGTH_SHORT).show();
        	pool.play(sound, 1, 1, 0, 0, 1);
        	score = calcScore(playCnt);
        	strResult = "게임 종료! 당신의 점수는 " + score + "점 입니다.";
        	
        	showSimpleDialog();	// 다이얼 로그 창 띄우기
        	dbExcute(id, score);
        	
        }else{
        	strResult = playCnt + "회: " + Arrays.toString(user_Array)
        			+ "  " + result_Array[0] + " S   " + result_Array[1]
        			+ " B   " + result_Array[2] + " Out \n";
        }
        
        appendResult(strResult);
        
        //텍스트 필드 초기화
        for(TextView v2 : textViews){
        	v2.setText("");
        }
	}
	
	private void dbExcute(String id, int score) {
		SQLiteDatabase db = null;
    	ContentValues row = null;
    	
    	db = helper.getWritableDatabase();
    	
    	row = new ContentValues();
		row.put("id", id);
		row.put("pwd", pwd);
		row.put("score", score);
		
		db.insert("baseballgame", null, row);
		db.close();
    	/*if(!id.equals("admin")){
    		
    		row = new ContentValues();
    		row.put("id", id);
    		row.put("pwd", pwd);
    		row.put("score", score);
    		
    		db.insert("baseballgame", null, row);
    		db.close();
    	}else{
    		db.execSQL("update baseballgame set score = " + score + " where id = " + id + ";");
			db.close();
    	}*/
	}

	/**
	 * 점수 계산 메서드
	 * @param playCnt
	 * @return
	 */
	private int calcScore(int playCnt) {
		
		if(playCnt == 1){
			score = 200;
		}else if(playCnt == 2 || playCnt == 3){
			score = 100;
		}else if(playCnt == 4 || playCnt == 5){
			score = 90;
		}else if(playCnt == 6 || playCnt == 7){
			score = 80;
		}else if(playCnt == 8 || playCnt == 9){
			score = 70;
		}else if(playCnt >= 10){
			score = 50;
		}
		
		return score;
	}

	/**
	 * 취소 버튼을 눌렀을 때
	 * @param v
	 */
	public void doCancel(View v){
		
		if(inputClick > 0){
			if(textViews[--inputClick].getText().toString().length() == 1){
				textViews[inputClick].setText("");
			}
		}
	}
	
	/**
	 * 게임이 종료된 후 다이얼로그창 띄우기 
	 */
	private void showSimpleDialog() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("숫자 야구 게임")
			   .setMessage("한게임 더 하실래요?")
			   .setIcon(R.drawable.ic_launcher)
			   .setNegativeButton("아니오", simpleListener)
			   .setPositiveButton("예", simpleListener)
			   .show();
	}
	
	private DialogInterface.OnClickListener simpleListener = new DialogInterface.OnClickListener() {
		
		@Override
		public void onClick(DialogInterface dialog, int which) {
			
			switch(which){ 
			case DialogInterface.BUTTON_POSITIVE :
				init();
				break;
			case DialogInterface.BUTTON_NEGATIVE :
				//메인으로 돌아가는 코드 작성
				Intent intent = new Intent(PlayActivity.this, MainActivity.class);
				startActivity(intent); 
				break;
			}
			
		}
	};
	
	//결과 뷰에 결과 출력
    public void appendResult(String str){
    	textviewResult.append(str);
        ScrollView result_scrollView = (ScrollView) findViewById(R.id.result_scrollView);
        result_scrollView.scrollTo(0, textviewResult.getHeight());//자동 스크롤 포커스
    }
    
}
